/*
外观模式(Facade Pattern)又叫门面模式，定义一个将子系统的一组接口集成在一起的高层接口，以提供一个一致的外观

外观模式让外界减少与子系统内多个模块的直接交互，从而减少耦合，让外界可以更轻松地使用子系统

该设计模式由以下角色组成
+ 门面角色：外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合
+ 子系统角色:实现了子系统的功能。它对客户角色和Facade是未知的
+ 客户角色:通过调用Facede来完成要实现的功能

遥控器、自动驾驶汽车、房屋中介
*/
class Sum {
  sum(a, b) {
    return a + b
  }
}
class Minus {
  minus(a, b) {
    return a - b
  }
}
class Multiply {
  multiply(a, b) {
    return a * b
  }
}
class Calculator {
  sumObj
  minusObj
  multiplyObj
  constructor() {
    this.sumObj = new Sum()
    this.minusObj = new Minus()
    this.multiplyObj = new Multiply()
  }
  sum(...args) {
    return this.sumObj.sum(...args)
  }
  minus(...args) {
    return this.minusObj.minus(...args)
  }
  multiply(...args) {
    return this.multiplyObj.multiply(...args)
  }
}
const calculator = new Calculator()
console.log(calculator.sum(1, 2))
console.log(calculator.minus(1, 2))
console.log(calculator.multiply(1, 2))
